import router from '@/router'
import store from '@/store'

// 按需导入所有的动态路由
// import { asyncRoutes } from '@/router'

import NProgress from 'nprogress' // 引入一份进度条插件
import 'nprogress/nprogress.css' // 引入进度条样式

// 页面进入 设置进度条: nprogress
// 下载 => 导包 => 调用方法
// 切换页面 => 开启进度条;  真的进入页面 => 关闭

const WHITE_LIST = ['/login', '/404']

// next() 必须调用
router.beforeEach(async(to, from, next) => {
  console.log(to, 888)
  NProgress.start()

  // next()
  const token = store.getters.token
  if (token) {
    // 有token => 优化
    if (to.path === '/login') {
      // 有token 登陆过 没必要  优化:引导首页
      next('/')
      // 拦截
      NProgress.done()
    } else {
      // 不去login  随你去

      // 进入页面之前, 应该先看清这个人的权限,
      // 只有获取到了用户的权限, 我才能放行
      // 异步的函数 => 等一个异步操作结束以后, 再去做某件事(封装promise)

      // 我们希望是 只有在仓库里没有用户资料, 这个时候发请求
      if (!store.state.user.userInfo.userId) {
        const { roles: { menus }} = await store.dispatch('user/getUserProfile')
        console.log(menus, 10990)

        // 封装了路由模块, 所有跟路由相关的操作都应该放在路由模块(规范!!!)
        // 过滤路由这个操作应该放在路由模块

        // actions内部帮我们封装了promise
        // 只要是分发actions ,无论同步异步, 都是await 接受结果(规范)
        // otherRoutes => 过滤好的路由规则(用户自己的路由规则)
        const otherRoutes = await store.dispatch('permission/filterRoutes', menus)

        // 一定是看清了这个人的所有信息(menus), 给他添加对应的路由规则, 放他进去
        // router.addRoutes([{},{}, ....])
        // 临时先添加所有的动态路由规则
        // addRoutes 动态添加路由规则们 (耗时的,  异步的)  不会立即生效
        router.addRoutes([
          ...otherRoutes,
          { path: '*', redirect: '/404', hidden: true }
        ])

        // router.addRoutes([{ path: '*', redirect: '/404', hidden: true }])

        // 为了让以上的路由规则生效以后, 再进入页面( => 重进了一次页面)
        // next({
        //   path: to.path
        // })
        // ...to  你原来想去哪, 按照原来的方式再去一次
        next({
          ...to,
          replace: true // 避免路由跳转历史重复的问题
        })

        return
      }

      next()
    }
  } else {
    // 没有token
    // 判断是否去白名单
    if (WHITE_LIST.includes(to.path)) {
      // 是白名单
      next()
    } else {
      // 去的区重要的地方
      next('/login')
      // 拦截
      NProgress.done()
    }
  }
})

// 后置守卫(页面进入之后)
// 如果你的前置守卫拦截了, 后置守卫有一种情况是不会触发的!!
// 解决:  在你的前置守卫 拦截 手动关闭进度条!!!NProgress.done()
router.afterEach((to, from) => {
  // setTimeout(() => {
  NProgress.done()
  // }, 300)
})

// 这个文件专门用于添加路由前置守卫
// 登录访问控制? 登录了才能看哪些页面
// 白名单 => whilelist = ['/login', '/reg'] =>不需要登录也能访问的页面
// 如果去的是白名单 , 直接放行
// 如果去的不是白名单   有token 直接放行;  没有token 拦截走登录

// import router from './router'
// import store from './store'
// import { Message } from 'element-ui'
// import NProgress from 'nprogress' // progress bar
// import 'nprogress/nprogress.css' // progress bar style
// import { getToken } from '@/utils/auth' // get token from cookie
// import getPageTitle from '@/utils/get-page-title'

// NProgress.configure({ showSpinner: false }) // NProgress Configuration

// // 设置了 白名单 => 不需要验证token也能访问的(不重要的)
// // 一级路由 login 404 layout(...)
// const whiteList = ['/login', '/404']

// // 前置守卫: 路由被匹配成功以后, 对应的页面组件展示在浏览器之前, 经过前置守卫
// // 只有前置守卫放行了( next() ), 页面组件才会展示在我们面前
// router.beforeEach(async(to, from, next) => {
//   // start progress bar
//   NProgress.start()

//   // set page title
//   document.title = getPageTitle(to.meta.title)

//   // determine whether the user has logged in
//   // 这个函数用于判断用户有无token
//   const hasToken = getToken()

//   if (hasToken) {
//     // 有token => 直接放行 (优化点 判断一下他去的是登录页么)
//     if (to.path === '/login') {
//       // 要去登录页 且登陆过 没必要 => 引导到首页
//       next({ path: '/' })
//       NProgress.done()
//     } else {
//       // 表示去的不是登录页, 直接放行
//       const hasGetUserInfo = store.getters.name
//       if (hasGetUserInfo) {
//         next()
//       } else {
//         try {
//           // get user info
//           await store.dispatch('user/getInfo')

//           next()
//         } catch (error) {
//           // remove token and go to login page to re-login
//           await store.dispatch('user/resetToken')
//           Message.error(error || 'Has Error')
//           next(`/login?redirect=${to.path}`)
//           NProgress.done()
//         }
//       }
//     }
//   } else {
//     // 没有token

//     // 判断去的是否是白名单
//     if (whiteList.includes(to.path)) {
//       // 去的是白名单 => 可以去
//       next()
//     } else {
//       // 去的不是白名单 且没有token , 不能去 => 拦截走登录页
//       next(`/login?redirect=${to.path}`)
//       NProgress.done()
//     }
//   }
// })

// router.afterEach(() => {
//   // finish progress bar
//   NProgress.done()
// })
